/*================================================================
*   Copyright (C) 2024 baichao All rights reserved.
*
*   文件名称：main.c
*   创 建 者：baichao
*   创建日期：2024年01月08日
*   描    述：
*
================================================================*/

/*
 * 给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
 * 你必须在 原地 旋转图像，这意味着你需要直接修改输入的二维矩阵。请不要
 * 使用另一个矩阵来旋转图像。
 *
 * 示例 1：
 *   输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
 *   输出：[[7,4,1],[8,5,2],[9,6,3]]
 *
 * 示例 2：
 *   输入：matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
 *   输出：[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
 *
 * 提示：
 *   n == matrix.length == matrix[i].length
 *   1 <= n <= 20
 *   -1000 <= matrix[i][j] <= 1000
 */

#include <stdio.h>
#include <stdlib.h>

void swap(int* a, int* b) {
  *a = *a + *b;
  *b = *a - *b;
  *a = *a - *b;
}

// 先沿对角线翻转，再逐行逆转。
void rotate(int** matrix, int matrixSize, int* matrixColSize) {
  int i = 0, j = 0;
  for (i = 0; i < matrixSize; i++) {
    for (j = 0; j < *matrixColSize; j++) {
      if (i > j) {
        swap(&matrix[i][j], &matrix[j][i]);
      }
    }
  }
  for (i = 0; i < *matrixColSize / 2; i++) {
    for (j = 0; j < matrixSize; j++) {
      swap(&matrix[j][i], &matrix[j][matrixSize - 1 - i]);
    }
  }
}

int main() {
  int matrixData[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
  int matrixSize = sizeof(matrixData) / sizeof(matrixData[0]);
  int matrixColSize = 3;

  int* matrix[matrixSize];
  for (int i = 0; i < matrixSize; i++) {
    matrix[i] = matrixData[i];
  }

  printf("Original Matrix:\n");
  for (int i = 0; i < matrixSize; i++) {
    for (int j = 0; j < matrixColSize; j++) {
      printf("%d ", matrix[i][j]);
    }
    printf("\n");
  }

  rotate(matrix, matrixSize, &matrixColSize);

  printf("Rotated Matrix:\n");
  for (int i = 0; i < matrixSize; i++) {
    for (int j = 0; j < matrixColSize; j++) {
      printf("%d ", matrix[i][j]);
    }
    printf("\n");
  }

  return 0;
}
